package util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Date;
import java.util.Map;

/**
 * @author NAME-L
 * @Description 判断工具类
 * @className EmptyUtil
 * @date 2021-11-09 09:56:09
 */
public class EmptyUtil {
    /**
     * 判断传入的对象是否为空
     * @param obj
     * @return
     */
    public static boolean isEmpty(Object obj){
        if(null == obj) return true;
        if(obj instanceof CharSequence){    //判断字符串是否为null或""
            CharSequence charSequence = (CharSequence)obj;
            return charSequence.length() == 0;
        }
        if(obj instanceof Collection){
            return ((Collection)obj).isEmpty();
        }
        if(obj instanceof Map){
            return ((Map)obj).isEmpty();
        }
        //如果传入的对象是对象数组（注意：数组元素也有可能是上面碰到的类型，甚至有可能也是一个对象数组）
        if(obj instanceof  Object[]){
            Object[] objArray = (Object[])obj;
            if(objArray.length == 0) return true;
            //如果数组有有元素，那么每个元素都需要重复上面的判断 - 递归调用
            for(int i = 0; i < objArray.length; i++){
                if(!isEmpty(objArray[i])){
                    return false;
                }
            }
        }
        return false;
    }

    public static boolean isNotEmpty(Object obj){
        return !isEmpty(obj);
    }

    public static boolean isBlank(String str) {
        int strLen;
        if (str != null && (strLen = str.length()) != 0) {
            for(int i = 0; i < strLen; ++i) {
                if (!Character.isWhitespace(str.charAt(i))) {
                    return false;
                }
            }

            return true;
        } else {
            return true;
        }
    }

    public static boolean isNotBlank(String str) {
        return !isBlank(str);
    }


    /**
     * 校验整型id的合法性
     * @param id 待校验id
     */
    public static void validId(Integer id){
        if (isEmpty(id)){
            throw new RuntimeException("待删除id为空，删除失败！");
        }
        if (id <= 0) {
            throw new RuntimeException("待删除id非法（小于0），删除失败！");
        }
    }

    /**
     *  如果任意一个参数为空 返回true
     * @param obj
     * @return
     */
    public static boolean isAnyOneEmpty(Object ... obj) {
        for (int i = 0; i <obj.length ; i++) {
            boolean temp = isEmpty(obj[i]);
            if (temp){
                return true;
            }
        }
        return false;
    }

    /**
     *  如果任意一个参数为空 返回false
     * @param obj
     * @return
     */
    public static boolean isNotAnyOneEmpty(Object ... obj) {
        return !isAnyOneEmpty(obj);
    }

    /**
     * 类 空判断 所有值为空返回true
     * @param t
     * @param <T>
     * @return
     */
    public static <T> boolean beanIsEmpty(T t) {
        if (isNotEmpty(t)) {
            Field[] fields = t.getClass().getDeclaredFields();
            for (Field obj : fields) {
                if (isEmpty(getBeanValue(t, obj))) {
                    return true;
                }
            }
            return false;
        }
        return true;
    }

    //通过反射拿到值
    private static String  getBeanValue(Object obj, Field field){
        try{
            //设置放开私有变量
            field.setAccessible(true);
            //获取属性的名字
            String name = field.getName();
            //将属性名字首字母大写
            name = name.replaceFirst(name.substring(0,1),name.substring(0,1).toUpperCase());
            //整合出属性的get方法
            Method m = obj.getClass().getMethod("get" + name);
            return dataCheck(m.invoke(obj));
        }catch(Exception e){
            e.printStackTrace();
            return null;
        }
    }

    //处理时间格式的参数
    private static String dataCheck(Object obj){
        SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return (obj instanceof Date || obj instanceof LocalDate) ? simpleFormat.format(obj) : String.valueOf(obj);
    }

}
